package com.huamoxi.aop;

import jakarta.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Arrays;
import java.util.Objects;

@Aspect
@Component
@Order(2)
public class RequestAspect {

    private final Logger logger = LoggerFactory.getLogger(RequestAspect.class);

    @Around("@annotation(com.huamoxi.annotation.LogRequest) || @within(com.huamoxi.annotation.LogRequest)")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 记录请求开始时间
        long startTime = System.currentTimeMillis();

        // 获取请求方法
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs(); // 获取请求参数
        String requestMethod; // 根据实际场景获取 HTTP 请求方法

        // 可以通过 HttpServletRequest 来获取请求信息
        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
        requestMethod = request.getMethod();

        // 执行目标方法
        Object result = joinPoint.proceed();

        // 记录请求结束时间
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime; // 执行时间

        // 打印日志
        logger.info("--------- 方法调用（start） ---------");
        logger.info("--> 调用类: {}", joinPoint.getTarget().getClass().getSimpleName());
        logger.info("--> 调用方法: {}", methodName);
        logger.info("--> 请求参数: {}", Arrays.toString(args));
        logger.info("--> 请求方式: {}", requestMethod);
        logger.info("--> 请求执行时间: {} ms", executionTime);
        logger.info("--------- 方法调用（end） ---------");

        return result; // 返回结果
    }
}
